package cn.com.mayue.guava.eventBus;

import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import org.junit.Test;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * Created by mayue on 2017/4/1.
 * 简单的 eventBus 事件测试
 * EventBus：核心类，代表了一个事件总线。Publish事件也由它发起。
 * AsyncEventBus：在分发事件的时候，将其存入一个全局队列的异步分发模式。
 * Subscriber：对某个事件的处理器抽象，封装了事件的订阅者以及处理器，并负责事件处理
 * SubscriberRegistry：订阅注册表，它用于存储Subscriber跟Event的对应关系，以便于EventBus在publish一个事件时，可以找到它对应的Subscriber。
 * Dispatcher：事件分发器，它定义了事件的分发策略。
 *
 * @Subscribe：用于标识事件处理器的注解，当EventBus publish一个事件后，相应的Subscriber将会得到通知并执行事件处理器。
 * @AllowConcurrentEvents：该注解跟@Subscribe一同使用，标识该订阅者的处理方法为线程安全的，该注解还用于标识该方法将可能会被EventBus在多线程环境下执行。
 * DeadEvent：死信（没有订阅者关注的事件）对象。
 * SubscribeExceptionHandler：订阅者抛出异常的处理器。
 * SubscribeExceptionContext：订阅者抛出异常的上下文对象
 */
public class GuavaEventbusTest {
    /**
     * 同步测试
     */
    @Test
    public void eventBusTest() {
        EventBus eventBus = new EventBus();
        /**
         * 注册事件处理器
         */
        eventBus.register(new Object() {
            @Subscribe
            public void handleSomethingChangeEvent(SomeThingChangeEvent someThingChangeEvent) {
                System.out.println("处理信息变化事件：" + someThingChangeEvent.getTestField());
            }

            @Subscribe
            public void handleChangeEvent(BaseEventBusEvent baseEvent) {
                System.out.println("所有事件的父类");
            }

        });
        eventBus.post(new SomeThingChangeEvent("something"));
    }

    static class BaseEventBusEvent {

    }

    static class SomeThingChangeEvent extends BaseEventBusEvent {
        private String testField;

        public SomeThingChangeEvent(String testField) {
            this.testField = testField;
        }

        public String getTestField() {
            return testField;
        }
    }

    /**
     * 异步测试
     */
    @Test
    public void testAyncEventBus() {
        Executor executor = Executors.newFixedThreadPool(10);
        AsyncEventBus asyncEventBus = new AsyncEventBus("asyncEventBus", executor);
        /**
         * 注册事件处理器
         */
        asyncEventBus.register(new Object() {
            @Subscribe
            public void handleUserInfoChangeEvent(SomeThingChangeEvent someThingChangeEvent) {
                System.out.println("处理信息变化事件：" + someThingChangeEvent.getTestField());
            }

            @Subscribe
            public void handleChangeEvent(BaseEventBusEvent baseEventBusEvent) {
                System.out.println("所有事件的父类");
            }

        });
        asyncEventBus.post(new SomeThingChangeEvent("aync"));
        System.out.println("异步EventBus");
    }
}
